header%20ipynb.png

Hands-On


Hands-On ini digunakan pada kegiatan Microcredential Associate Data Scientist 2021

Tugas Mandiri Pertemuan 14


Pertemuan 14 (empatbelas) pada Microcredential Associate Data Scientist 2021 menyampaikan materi mengenai Membangun Model (RNN dan LSTM). silakan Anda kerjakan Latihan 1 s/d 5. Output yang anda lihat merupakan panduan yang dapat Anda ikuti dalam penulisan code :)

RNN

Jaringan saraf berulang atau recurrent neural network (RNN) adalah jenis arsitektur jaringan saraf tiruan yang pemrosesannya dipanggil berulang-ulang untuk memroses masukan yang biasanya adalah data sekuensial. RNN masuk dalam kategori deep learning karena data diproses melalui banyak lapis (layer). RNN telah mengalami kemajuan yang pesat dan telah merevolusi bidang-bidang seperti pemrosesan bahasa alami (NLP), pengenalan suara, sintesa musik, pemrosesan data finansial seri waktu, analisa deret DNA, analisa video, dan sebagainya.

RNN memroses input secara sekuensial, sampel per sampel. Dalam tiap pemrosesan, output yang dihasilkan tidak hanya merupakan fungsi dari sampel itu saja, tapi juga berdasarkan state internal yang merupakan hasil dari pemrosesan sampel-sampel sebelumnya (atau setelahnya, pada bidirectional RNN).

Berikut adalah ilustrasi bagaimana RNN bekerja. Misalnya kita membuat RNN untuk menerjemahkan bahasa Indonesia ke bahasa Inggris

image.png

Ilustrasi di atas kelihatan rumit, tapi sebenarnya cukup mudah dipahami.

  • sumbu horizontal adalah waktu, direpresentasikan dengan simbol t. Dapat kita bayangkan pemrosesan berjalan dari kiri ke kanan. Selanjutnya kita sebut t adalah langkah waktu (time step).

  • Keseluruhan input adalah kalimat, dalam hal ini:

      Budi pergi ke sekolah.
  • Pemrosean input oleh RNN adalah kata demi kata. Input kata-kata ini disimbolkan dengan x1 ,x2 , … ,x5 , atau secara umum xt.

  • Output adalah kalimat, dalam hal ini:

      Budi goes to school.
  • RNN memberikan output kata demi kata, dan ini kita simbolkan dengan ŷ1, ŷ2, …, ŷ5 , atau secara umum ŷt .

  • Dalam tiap pemrosesan, RNN akan menyimpan state internal yaitu st, yang diberikan dari satu langkah waktu ke langkah waktu berikutnya. Inilah “memori” dari RNN.

Dengan contoh di atas, kita bisa generalisasikan arsitektur RNN sebagai berikut:

image-2.png

Tambahan yang tidak terdapat di diagram sebelumnya adalah U, V, dan W, yang merupakan parameter-parameter yang dimiliki RNN. Kita akan bahas pemakaian parameter-parameter ini nanti.

Penting untuk dipahami bahwa walaupun ada empat kotak RNN di gambar di atas, empat kotak itu mencerminkan satu modul RNN yang sama (satu instans model dengan parameter-parameter U, V, dan W yang sama). Penggambaran di atas hanya agar aspek sekuensialnya lebih tergambar.

Alternatif representasinya adalah seperti ini, agar lebih jelas bahwa hanya ada satu modul RNN: image-3.png

Inilah sebabnya kenapa arsitektur ini disebut RNN. Kata recurrent (berulang) dalam RNN timbul karena RNN melakukan perhitungan yang sama secara berulang-ulang atas input yang kita berikan.

Sering juga kedua ilustrasi di atas digabungkan jadi satu sbb: image-4.png Sesuai dengan gambar di atas, ilustrasi di sebelah kanan adalah penjabaran (unrolled) dari versi berulang di sebelah kiri.

Latihan (1)

Melakukan import library yang dibutuhkan

In [1]:
# import library pandas
import pandas as pd

# Import library numpy
import numpy as np

# Import library matplotlib untuk visualisasi
import matplotlib.pyplot as plt

# import library for build model 
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import LSTM
from tensorflow.keras.layers import Dropout
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier

# import library untuk data preprocessing
from sklearn.preprocessing import MinMaxScaler
from sklearn.feature_selection import SelectKBest 
from sklearn.feature_selection import chi2 

# me-non aktifkan peringatan pada python
import warnings 
warnings.filterwarnings('ignore')

Load Dataset

In [2]:
#Panggil file (load file bernama Stock.csv) dan simpan dalam dataframe
dataset ="Stock.csv"
data = pd.read_csv(dataset)
In [3]:
# tampilkan 5 baris data 
data.head()
Out[3]:
Date Open High Low Close Volume Name
0 2006-01-03 56.45 56.66 55.46 56.53 3716500 UTX
1 2006-01-04 56.80 56.80 55.84 56.19 3114500 UTX
2 2006-01-05 56.30 56.49 55.63 55.98 3118900 UTX
3 2006-01-06 56.45 56.67 56.10 56.16 2874300 UTX
4 2006-01-09 56.37 56.90 56.16 56.80 2467200 UTX

Review Data

In [4]:
# Melihat Informasi lebih detail mengenai struktur DataFrame dapat dilihat menggunakan fungsi info()
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3020 entries, 0 to 3019
Data columns (total 7 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   Date    3020 non-null   object 
 1   Open    3019 non-null   float64
 2   High    3020 non-null   float64
 3   Low     3020 non-null   float64
 4   Close   3020 non-null   float64
 5   Volume  3020 non-null   int64  
 6   Name    3020 non-null   object 
dtypes: float64(4), int64(1), object(2)
memory usage: 165.3+ KB
In [5]:
# Kolom 'low' yang akan kita gunakan dalam membangun model
# Slice kolom 'low' 

Low_data = data.iloc[:,3:4].values
In [6]:
# cek output low_data
Low_data           
Out[6]:
array([[ 55.46],
       [ 55.84],
       [ 55.63],
       ...,
       [126.92],
       [127.29],
       [127.57]])
In [7]:
# Visualizing low_data

plt.figure(figsize=(14,10))                 
plt.plot(Low_data,c="red")
plt.title("Microsoft Stock Prices",fontsize=16)
plt.xlabel("Days",fontsize=16)
plt.ylabel("Scaled Price",fontsize=16)
plt.grid()
plt.show()

Latihan (2)

Data Preprocessing

In [8]:
# Menskalakan data antara 1 dan 0 (scaling) pada low data

scaler = MinMaxScaler()  
low_data_scaled = scaler.fit_transform(Low_data)
In [15]:
# definisikan variabel step dan train 

........................                      

........................
........................
In [16]:
# membuat fitur dan lists label

........................                
    ........................
    ........................
In [17]:
# mengonversi list yang telah dibuat sebelumnya ke array

........................                   
........................
In [18]:
# cek dimensi data dengan function .shape

........................                               
(2998, 21)
In [19]:
# 498 hari terakhir akan digunakan dalam pengujian
# 2500 hari pertama akan digunakan dalam pelatihan

........................            
........................          
........................  
........................
In [20]:
# reshape data untuk dimasukkan kedalam Keras model

........................           
........................
In [21]:
# cek kembali dimensi data yang telah di reshape dengan function .shape

........................
........................                             
(2500, 21, 1)
(498, 21, 1)

Sekarang kita bisa mulai membuat model kita, dimulai dengan RNN

Latihan (3)

Build Model - RNN

In [22]:
# buat varibel penampung model RNN
........................
In [23]:
# Output dari SimpleRNN akan menjadi bentuk tensor 2D (batch_size, 40) dengan Dropout sebesar 0.15

........................
........................

........................
........................

........................
........................

# Add a Dense layer with 1 units.
........................
In [24]:
# menambahkan loss function kedalam model RNN dengan tipe MSE

........................
In [25]:
# fit the model RNN, dengan epoch 20 dan batch size 25

........................
Epoch 1/20
100/100 [==============================] - 8s 29ms/step - loss: 0.1655
Epoch 2/20
100/100 [==============================] - ETA: 0s - loss: 0.0520- ETA: 0s - loss - 3s 28ms/step - loss: 0.0519
Epoch 3/20
100/100 [==============================] - 3s 28ms/step - loss: 0.0279
Epoch 4/20
100/100 [==============================] - 3s 26ms/step - loss: 0.0183: 0s - loss:
Epoch 5/20
100/100 [==============================] - 2s 23ms/step - loss: 0.0137
Epoch 6/20
100/100 [==============================] - 2s 23ms/step - loss: 0.0112
Epoch 7/20
100/100 [==============================] - 2s 22ms/step - loss: 0.0084: 0s - los - ETA: 0s - loss: 0.008
Epoch 8/20
100/100 [==============================] - 2s 25ms/step - loss: 0.0076
Epoch 9/20
100/100 [==============================] - 2s 23ms/step - loss: 0.0065
Epoch 10/20
100/100 [==============================] - 2s 24ms/step - loss: 0.0059
Epoch 11/20
100/100 [==============================] - 2s 23ms/step - loss: 0.0055: 0
Epoch 12/20
100/100 [==============================] - 2s 23ms/step - loss: 0.0051
Epoch 13/20
100/100 [==============================] - 2s 23ms/step - loss: 0.0042: 0s - l
Epoch 14/20
100/100 [==============================] - 2s 23ms/step - loss: 0.0041
Epoch 15/20
100/100 [==============================] - 2s 23ms/step - loss: 0.0040: 2s - l
Epoch 16/20
100/100 [==============================] - 2s 23ms/step - loss: 0.0040: 0s - 
Epoch 17/20
100/100 [==============================] - 2s 23ms/step - loss: 0.0035
Epoch 18/20
100/100 [==============================] - 2s 23ms/step - loss: 0.0032:  - ETA: 0s - l
Epoch 19/20
100/100 [==============================] - 2s 23ms/step - loss: 0.0030
Epoch 20/20
100/100 [==============================] - 2s 23ms/step - loss: 0.0028
Out[25]:
<tensorflow.python.keras.callbacks.History at 0x23fd99a5b80>
In [26]:
# Prediksi Model RNN
........................

........................
In [38]:
rnn_score
Out[38]:
0.9695404783998754

Latihan (4)

Build Model - LSTM

In [28]:
# buat varibel penampung model LSTM
........................
In [29]:
# Add a LSTM layer with 40 internal units. dengan Dropout sebesar 0.15

........................
........................

........................
........................

........................
........................

# Add a Dense layer with 1 units.
........................
In [30]:
# menambahkan loss function kedalam model lstm dengan tipe MSE

........................
In [31]:
# fit lstm model, dengan epoch 20 dan batch size 25

........................
Epoch 1/20
100/100 [==============================] - 15s 50ms/step - loss: 0.0169
Epoch 2/20
100/100 [==============================] - 5s 47ms/step - loss: 0.0037
Epoch 3/20
100/100 [==============================] - 4s 45ms/step - loss: 0.0029
Epoch 4/20
100/100 [==============================] - 5s 49ms/step - loss: 0.0031
Epoch 5/20
100/100 [==============================] - 5s 46ms/step - loss: 0.0030
Epoch 6/20
100/100 [==============================] - 5s 46ms/step - loss: 0.0025
Epoch 7/20
100/100 [==============================] - 5s 46ms/step - loss: 0.0026
Epoch 8/20
100/100 [==============================] - 5s 49ms/step - loss: 0.0026: 0s - los
Epoch 9/20
100/100 [==============================] - 5s 53ms/step - loss: 0.0024
Epoch 10/20
100/100 [==============================] - 5s 54ms/step - loss: 0.0023
Epoch 11/20
100/100 [==============================] - 5s 53ms/step - loss: 0.0021
Epoch 12/20
100/100 [==============================] - 5s 52ms/step - loss: 0.0023
Epoch 13/20
100/100 [==============================] - 5s 50ms/step - loss: 0.0020
Epoch 14/20
100/100 [==============================] - 5s 45ms/step - loss: 0.0019
Epoch 15/20
100/100 [==============================] - 5s 45ms/step - loss: 0.0020
Epoch 16/20
100/100 [==============================] - 5s 49ms/step - loss: 0.0016
Epoch 17/20
100/100 [==============================] - 5s 46ms/step - loss: 0.0016
Epoch 18/20
100/100 [==============================] - 5s 50ms/step - loss: 0.0017
Epoch 19/20
100/100 [==============================] - 6s 58ms/step - loss: 0.0016
Epoch 20/20
100/100 [==============================] - 5s 47ms/step - loss: 0.0015
Out[31]:
<tensorflow.python.keras.callbacks.History at 0x23fe60a53d0>
In [32]:
# Prediksi Model LSTM
........................

........................
In [39]:
lstm_score
Out[39]:
0.8531204922506259

Latihan (5)

Evaluation

In [40]:
# Cetak nilai prediksi masing-masing model dengan menggunakan r^2 square

........................
........................
R^2 Score dari model RNN 0.9695404783998754
R^2 Score dari model LSTM 0.8531204922506259

Visualisasi Perbandingan Hasil Model prediksi dengan data original

In [35]:
lstm_predictions = scaler.inverse_transform(lstm_predictions)
rnn_predictions = scaler.inverse_transform(rnn_predictions)
test_y = scaler.inverse_transform(test_y.reshape(-1,1))
In [41]:
plt.figure(figsize=(16,12))

plt.plot(test_y, c="blue",linewidth=2, label="original")
plt.plot(lstm_predictions, c="green",linewidth=2, label="LSTM")
plt.plot(rnn_predictions, c="red",linewidth=2, label="RNN")
plt.legend()
plt.title("PERBANDINGAN",fontsize=20)
plt.grid()
plt.show()

Berikan Kesimpulan Anda!

In [ ]:
# write here